package module02.task01;

import java.io.*;

/**
 * 定义一个长度为[16][16]的整型二维数组并输入或指定所有位置的元素值，
 * 分别实现二维数组中所有行和所有列中所有元素的累加和并打印。
 * 再分别实现二维数组中左上角到右下角和右上角到左下角所有元素的累加和并打印。
 */
public class ArrayPrinter {

    final static int ARRAY_WIDTH = 16;
    final static String INPUT_FILE = "src/module02/task01/array.txt";

    private int[][] array;


    /**
     * 构造函数：读取文件中的数组，并存入类成员变量array
     * @param inputFile
     * @throws IOException
     */
    ArrayPrinter(String inputFile) throws IOException {
        File file = new File(inputFile) ;
        Reader r = new FileReader(file) ;
        BufferedReader buf = new BufferedReader(r) ;
        String line = null ;
        array = new int[ARRAY_WIDTH][ARRAY_WIDTH]  ;

        System.out.print("定义如下数组：\n");
        for(int row=0; row<ARRAY_WIDTH; row++){
            line = buf.readLine();
            String[] str = line.split(" ") ;
            for(int col=0; col<ARRAY_WIDTH; col++){
                array[row][col] = Integer.parseInt(str[col]) ;
                System.out.print(array[row][col]+"\t") ;
            }
            System.out.println() ;

        }
        buf.close() ;
    }

    /**
     * 计算各列累加值
     * @return 返回表示各列累加值的一维数组
     */
    public int[] sumCols(){
        int[] sum = new int[ARRAY_WIDTH];
        System.out.println("数组各列累加和为：");
        for(int col=0; col<ARRAY_WIDTH; col++){
            sum[col] = 0;
            for(int row=0; row<ARRAY_WIDTH; row++){
                sum[col] += array[row][col];
            }
            System.out.print("第"+(col+1)+"列："+sum[col]+"\t");
        }
        System.out.println();
        return sum;
    }

    /**
     * 计算各行累加值
     * @return 返回表示各行累加值的一维数组
     */
    public int[] sumRows(){
        int[] sum = new int[ARRAY_WIDTH];
        System.out.println("数组各行累加和为：");
        for(int row=0; row<ARRAY_WIDTH; row++){
            sum[row] = 0;
            for(int col=0; col<ARRAY_WIDTH; col++){
                sum[row] += array[row][col];
            }
            System.out.print("第"+(row+1)+"列："+sum[row]+"\t");
        }
        System.out.println();
        return sum;
    }

    /**
     * 计算左上角到右下角累加值
     * @return 返回左上角到右下角累加值
     */
    public int sumLeft2Right(){
        int sum = 0;
        for(int i=0; i<ARRAY_WIDTH; i++){
            sum += array[i][i];
        }
        System.out.println("从左上至右下的对角线累加和为："+sum);
        return sum;
    }

    /**
     * 计算右上角到左下角累加值
     * @return 返回右上角到左下角累加值
     */
    public int sumRight2Left(){
        int sum = 0;
        for(int i=0; i<ARRAY_WIDTH; i++){
            sum += array[ARRAY_WIDTH-i-1][i];
        }
        System.out.println("从右上至左下的对角线累加和为："+sum);
        return sum;
    }



    public static void main(String[] args) throws IOException {
        // 读取数组，存入类内部
        ArrayPrinter ap = new ArrayPrinter(INPUT_FILE);
        // 计算所要求的值
        ap.sumCols();
        ap.sumRows();
        ap.sumLeft2Right();
        ap.sumRight2Left();

    }
}

